package cn.iocoder.yudao.module.search.service.search;

import cn.iocoder.yudao.module.search.api.search.dto.*;

import java.util.List;

/**
 * 搜索服务接口
 *
 * @author 芋道源码
 */
public interface SearchService {

    // ========== 索引管理 ==========

    /**
     * 创建索引
     *
     * @param reqDTO 索引创建请求
     * @return 是否创建成功
     */
    Boolean createIndex(SearchIndexReqDTO reqDTO);

    /**
     * 删除索引
     *
     * @param tenantId 租户ID
     * @param indexName 索引名称
     * @return 是否删除成功
     */
    Boolean deleteIndex(Long tenantId, String indexName);

    /**
     * 检查索引是否存在
     *
     * @param tenantId 租户ID
     * @param indexName 索引名称
     * @return 是否存在
     */
    Boolean existsIndex(Long tenantId, String indexName);

    /**
     * 获取索引信息
     *
     * @param tenantId 租户ID
     * @param indexName 索引名称
     * @return 索引信息
     */
    SearchIndexRespDTO getIndex(Long tenantId, String indexName);

    /**
     * 获取租户所有索引列表
     *
     * @param tenantId 租户ID
     * @return 索引列表
     */
    List<SearchIndexRespDTO> listIndexes(Long tenantId);

    // ========== 文档管理 ==========

    /**
     * 创建文档
     *
     * @param reqDTO 文档创建请求
     * @return 文档ID
     */
    String createDocument(SearchDocumentReqDTO reqDTO);

    /**
     * 更新文档
     *
     * @param reqDTO 文档更新请求
     * @return 是否更新成功
     */
    Boolean updateDocument(SearchDocumentReqDTO reqDTO);

    /**
     * 删除文档
     *
     * @param tenantId 租户ID
     * @param indexName 索引名称
     * @param documentId 文档ID
     * @return 是否删除成功
     */
    Boolean deleteDocument(Long tenantId, String indexName, String documentId);

    /**
     * 获取文档
     *
     * @param tenantId 租户ID
     * @param indexName 索引名称
     * @param documentId 文档ID
     * @return 文档信息
     */
    SearchDocumentRespDTO getDocument(Long tenantId, String indexName, String documentId);

    /**
     * 批量操作文档
     *
     * @param reqDTO 批量操作请求
     * @return 批量操作结果
     */
    SearchBulkRespDTO bulkDocument(SearchBulkReqDTO reqDTO);

    // ========== 搜索查询 ==========

    /**
     * 搜索查询
     *
     * @param reqDTO 搜索查询请求
     * @return 搜索结果
     */
    SearchQueryRespDTO search(SearchQueryReqDTO reqDTO);

}
